package wine.ejb.utilities;

import java.util.List;
import java.util.Map;

import javax.persistence.Query;

public interface BaseDao<T> {
	public T findByPk(Object id);

	/**
	 * 删除对象
	 * 
	 * @param o
	 */
	public void remove(Object o);

	/**
	 * 保存数据到数据库
	 * 
	 * @param o
	 */
	public T save(Object o);
	/**
	 * 更新保存
	 * @param o
	 * @return
	 * @throws Exception
	 */
	public T bigSave(Object o)throws Exception;
	
	/**
	 * 保存数据到数据库
	 * @param o
	 * @throws Exception
	 */
	public T saveExcep(Object o)throws Exception;
	/**
	 * 按主键查找对象
	 * 
	 * @param id
	 */
	public void removeByPk(Object id);

	/**
	 * 通过页码查找记录 Query qry: 查询语句 pageIndex: 查询页号 pageSize: 每页记录数
	 */
	public PagedResults<T> findListByQuery(Query query, PageInfo pageInfo);

	/**
	 * 不分页查询
	 * 
	 * @param qry
	 *            Query 对象
	 * @return List
	 */
	public List<T> findListByQuery(Query query);

	/**
	 * 将参数作为一个MAP列表传输，进行查询
	 * 
	 * @param eql
	 *            ：查询语句
	 * @param firstResult
	 *            第一行记录
	 * @param pageSize
	 *            返回的行数
	 * @param parameterValue
	 *            参数列表
	 * @return PagedResults
	 */
	public PagedResults<T> findListByEJBQL(String ejbql, PageInfo pageInfo,
			Map parameters);

	/**
	 * 根据EJBQL查询列表
	 * 
	 * @param EJBQL
	 *            查询语句
	 * @param enquiryParamObject
	 *            查询条件对象
	 * @param pageInfo
	 *            页码信息
	 * @return PagedResults<T>
	 */
	public PagedResults<T> findList(String EJBQL, Object enquiryParamObject,
			PageInfo pageInfo);

	/**
	 * 查询的数据不包括已经删除的数据（STATUS<99）；
	 * 
	 * @param enquiryParamObject
	 * @param pageInfo
	 * @return PagedResults
	 */
	public PagedResults<T> findList(Object enquiryParamObject, PageInfo pageInfo);

	/**
	 * 查询包含已删除的记录
	 * 
	 * @param enquiryParamObject
	 * 
	 * @param pageInfo
	 *            分页信息
	 * @param includeDeleted
	 *            是否包括已经删除的记录
	 * @return PagedResults
	 */
	public PagedResults<T> findList(Object enquiryParamObject,
			PageInfo pageInfo, Boolean includeDeleted);

	/**
	 * 查询包含已删除的记录
	 * 
	 * @param enquiryParamObject
	 * 
	 * @param pageInfo
	 *            分页信息
	 * @param includeDeleted
	 *            是否包括已经删除的记录
	 * @return PagedResults
	 */
	public PagedResults<T> findListWithIn(Object enquiryParamObject,
			String appendSql, PageInfo pageInfo, Boolean includeDeleted);

	/**
	 * 使用原生SQL查询（数据库级的SQL语句）
	 * 
	 * @param nativeSQL
	 * @param pageInfo
	 * @param parameterValue
	 * @return PagedResults
	 */
	public PagedResults<T> findByPageNativeSQL(String nativeSQL,
			PageInfo pageInfo, Map parameters);

	/**
	 * 查询记录总数；
	 * 
	 * @param eql
	 * @return int
	 */
	public int findRecordCount(String eql);

	/**
	 * 查找所有的记录（不分页）
	 * 
	 * @return List
	 */
	public List<T> findAll();

	/**
	 * 分页返回所有数据；
	 * 
	 * @param firstResult
	 *            数据开始行
	 * @param pageSize
	 *            每页显示多少行
	 * @return PagedResults
	 */
	public PagedResults<T> findPagedAll(PageInfo pageInfo);

	/**
	 * 根据条件返回 一个对象
	 * 
	 * @param ejbql
	 *            EJBQL
	 * @param parameters
	 *            参数
	 * @return Object<T>
	 */
	public T findObjByEJBQL(String ejbql, Map parameters);

	/**
	 * 
	 * @param ejbql
	 * @param parameters
	 * @return List<T>
	 */
	public List<T> findListByEJBQL(String ejbql);

	/**
	 * 
	 * @param ejbql
	 * @param parameters
	 * @return List<T>
	 */
	public List<T> findListByEJBQL(String ejbql, Map parameters);


	/**
	 * 运行原生SQL
	 * 
	 * @param nativeSQL
	 *            原生SQL
	 * @return int
	 */
	public int executeNativeSQL(String nativeSQL);

	/**
	 * 运行 EJBQL
	 * 
	 * @param ejbql
	 * @return int
	 */
	public int executeEJBQL(String ejbql);

	/**
	 * 根据ownerid来查找数据
	 * 
	 * @param ownerid
	 * @return List<T>
	 */
	public List<T> findByOwnerid(String ownerid, boolean likeParam);

	public void moveIndex(List<T> moveList, Integer offset);

	/**
	 * 
	 */
	public void redoIndex();

	public int executeEJBQL(String ejbql, Map parameters);

}
